맨위로가기

형 변환

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

형 변환은 프로그래밍 언어에서 변수의 데이터 타입을 다른 타입으로 변경하는 것을 의미하며, 크게 암시적 형 변환과 명시적 형 변환으로 나뉜다. 암시적 형 변환은 컴파일러가 자동으로 수행하며, 데이터 손실이나 정밀도 손실의 위험이 있어 주의해야 한다. 명시적 형 변환은 프로그래머가 직접 지정하며, C++의 `static_cast`와 같은 캐스트 연산자를 사용한다. 객체 지향 프로그래밍에서는 업캐스팅, 다운캐스팅, 크로스캐스팅과 같은 형 변환이 사용되며, 다운캐스팅은 안전하지 않아 주의가 필요하다. 다양한 프로그래밍 언어는 각기 다른 방식으로 형 변환을 지원하며, 형 변환은 보안 취약점을 유발할 수 있으므로 신중하게 사용해야 한다.

더 읽어볼만한 페이지

  • 연산자 (프로그래밍) - 중위 표기법
    중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다.
  • 연산자 (프로그래밍) - 연산자 오버로딩
    연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다.
  • 단항 연산 - 1의 보수
    1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다.
  • 단항 연산 - 제곱근
    제곱근은 x² = a를 만족하는 x 값으로, a가 양수일 때 두 개의 제곱근을 가지며, 수학, 물리학, 기하학 등 다양한 분야에서 중요한 개념이고, 무리수와도 관련되어 행렬이나 연산자에도 확장된다.
  • 유형 이론 - 대수적 자료형
    대수적 자료형은 합 타입과 곱 타입을 조합하여 새로운 자료형을 정의하는 방법으로, 단일 연결 리스트나 이진 트리와 같은 자료 구조를 표현하고 패턴 매칭을 통해 자료형의 구조를 분해 및 처리하는 데 유용하며, 함수형 프로그래밍 언어에서 널리 사용된다.
  • 유형 이론 - 튜플
    튜플은 순서가 중요하고 중복된 원소를 허용하는 요소들의 모음으로, 길이에 따라 다양한 이름으로 불리며 집합론, 함수, 프로그래밍 언어 등에서 활용된다.
형 변환

2. 형 변환의 종류

형 변환은 크게 암시적 형 변환과 명시적 형 변환으로 나눌 수 있다.


  • 암시적 형 변환: 컴파일러가 자동으로 수행하는 형 변환이다. 예를 들어, 서로 다른 자료형의 변수끼리 연산할 때, 더 큰 자료형으로 자동 변환된다. 아래는 C 언어 코드 예시이다.


```c

double d;

long l;

int i;

if (d > i) d = i;

if (i > l) l = i;

if (d == l) d *= 2;

```

위 코드에서 `d`, `l`, `i`는 서로 다른 자료형을 갖지만, 연산 과정에서 자동으로 형 변환이 일어난다. 하지만 암시적 형 변환은 데이터 손실이나 정밀도 문제가 발생할 수 있으므로 주의해야 한다. 예를 들어, `double`형(부동소수점) 데이터를 `int`형(정수형) 변수로 변환하면 소수점 이하 값이 버려진다.[15]

  • 명시적 형 변환: 프로그래머가 직접 형 변환을 지정하는 것이다. 아래는 C++ 코드 예시이다.


```cpp

double da = 3.3;

double db = 3.3;

double dc = 3.4;

int result = (int)da + (int)db + (int)dc; // result == 9

// 암시적 변환이 사용될 경우 ("result = da + db + dc"와 같이), result는 10이 됩니다.

```

명시적 형 변환에는 확인됨, 미확인, 비트 패턴 등의 종류가 있으며, 객체 지향 프로그래밍에서는 다운캐스팅도 가능하다.[15]

2. 1. 암시적 형 변환 (자동 형 변환)

암시적 형 변환은 형 강제 변환(type coercion)이라고도 하며, 컴파일러에 의해 자동으로 수행되는 형 변환이다.[15] 프로그래밍 언어에 따라 컴파일러가 강제 변환을 제공하도록 허용하거나, 요구하기도 한다.

혼합형 표현식에서 하나 이상의 서브타입 데이터를 변환하여 런타임에 필요에 따라 상위 타입으로 변환하여 프로그램이 올바르게 실행되도록 할 수 있다. 예를 들어, C 언어 코드에서 변수들이 서로 다른 데이터 타입을 가지더라도, 비교나 할당 시 자동으로 동일한 데이터 타입으로 변환된다.

```c

double d;

long l;

int i;

if (d > i) d = i;

if (i > l) l = i;

if (d == l) d *= 2;

```

위 코드에서 `d`, `l`, `i`는 서로 다른 데이터 타입에 속하지만, 비교 또는 할당이 실행될 때마다 자동으로 동일한 데이터 타입으로 변환된다.

하지만, 암시적 형 변환은 주의해서 사용해야 한다. 부동 소수점에서 정수로 변환할 때 데이터가 손실될 수 있는데, 부동 소수점 값의 소수 부분은 잘려나가기(0으로 반올림) 때문이다. 반대로 정수에서 부동 소수점으로 변환할 때도 정밀도가 손실될 수 있다. 예를 들어, `float`는 IEEE 754 단정밀도 타입일 수 있으며, 정수 16777217을 정확하게 나타낼 수 없는 반면, 32비트 정수 타입은 가능하다.

```c

#include

int main(void)

{

int i_value = 16777217;

float f_value = 16777216.0;

printf("The integer is: %d\n", i_value);

printf("The float is: %f\n", f_value);

printf("Their equality: %d\n", i_value == f_value);

}

```

플로트를 IEEE 단정밀도로, 정수를 최소 32비트로 구현하는 컴파일러에서 이 코드는 다음과 같은 출력을 제공한다.

```text

The integer is: 16777217

The float is: 16777216.000000

Their equality: 1

```

마지막 줄에서 1은 같음을 나타낸다. `i_value`가 `f_value`와 비교될 때 float로 암시적으로 변환되어 정밀도가 손실되기 때문이다.

암묵적 형 변환의 중요한 내용은 다음과 같다.

  • `float`에서 `int`로의 변환은 절삭을 유발하며, 소수 부분을 제거한다.
  • `double`에서 `float`로의 변환은 숫자를 반올림한다.
  • `long`에서 `int`로의 변환은 초과하는 상위 비트를 삭제한다.


C 언어 및 C++에서는 암묵적 축소 변환을 허용하지만, 정보가 손실될 가능성이 있는 변환에 대해, 통상 컴파일러가 경고를 낸다. Java나 C# 등의 언어에서는, 암묵적 축소 변환을 허용하지 않고, 명시적인 변환이 필요하다. 형의 취급이 엄격한 F# 등의 함수형 언어에서는, 암묵적 확장 변환도 허용하지 않는다.

2. 2. 명시적 형 변환 (강제 형 변환)

명시적 형 변환은 타입 캐스팅이라고도 하며, 프로그래머가 프로그램 내에서 명시적으로 형 변환을 지정하는 것이다.[15] 사용자가 직접 형 변환을 지정하기 때문에 '캐스트'라고도 불린다.

C 언어 및 이와 유사한 언어에서는 캐스트 연산자를 사용하여 식의 우변 값을 지정된 자료형으로 형 변환한다. C 언어의 캐스트 연산자는 자료형 이름을 괄호로 묶은 `(''Type'')` 형식이며, 대상 식 앞에 붙인다.



double d = 1234.5678;

int x = (int)d;



C++(C++)에서는 기존의 C 언어 형식의 캐스트 구문 외에, 용도 및 의미를 명확하게 한 4개의 다른 캐스트 구문(`static_cast`, `reinterpret_cast`, `const_cast`, `dynamic_cast`)이 제공된다. C++에서는 의미가 모호한 C 언어 형식의 캐스트 구문은 권장되지 않으며, 상황에 따라 4개의 캐스트 구문을 적절히 사용하는 것이 권장된다.

명시적 형 변환에는 여러 종류가 있다.

  • 확인됨: 변환을 수행하기 전에, 대상 타입이 소스 값을 담을 수 있는지 런타임 검사를 수행한다. 그렇지 않은 경우 에러가 발생한다.
  • 미확인: 별도의 검사를 수행하지 않는다. 대상 타입이 소스 값을 담을 수 없는 경우, 결과는 정의되지 않는다.
  • 비트 패턴: 소스의 원시 비트 표현을 그대로 복사하여 대상 타입에 따라 재해석한다. 이는 에일리어싱을 통해서도 달성할 수 있다.


객체 지향 프로그래밍 언어에서는 다운캐스팅이 이루어지기도 한다. 다운캐스팅은 기본 클래스의 참조를 파생 클래스 중 하나로 캐스팅하는 것을 의미한다.

3. 객체 지향 프로그래밍에서의 형 변환

객체 지향 프로그래밍 언어에서는 클래스 간의 상속 관계에 따라 형 변환이 발생할 수 있다. C#에서는 형식 변환을 안전하게, 또는 안전하지 않게 수행할 수 있는데, 안전한 방식을 '확인된 형식 캐스트'라고 부른다.[9]

```csharp

Animal animal = new Cat();

Bulldog b = (Bulldog) animal; // animal이 Bulldog이면 Bulldog으로 변환, 아니면 예외 발생

b = animal as Bulldog; // animal이 Bulldog이면 Bulldog으로 변환, 아니면 null 할당

animal = null;

b = animal as Bulldog; // b는 null

```

C++(C++)에서도 비슷한 방식으로 형 변환을 할 수 있다.

```cpp

Animal* animal = new Cat;

Bulldog* b = static_cast(animal); // Animal 또는 Bulldog이 서로 상속 관계여야 컴파일됨

b = dynamic_cast(animal); // animal이 Bulldog이면 Bulldog으로 변환, 아니면 nullptr 할당

Bulldog& br = static_cast(*animal); // 위와 동일하지만, nullptr 반환 시 예외 발생

// 예외 처리를 피하는 코드에서는 잘 사용되지 않음

delete animal; // 리소스 해제

animal = nullptr;

b = dynamic_cast(animal); // b는 nullptr

```

C#, C++(C++), Java(Java)와 같은 객체 지향 프로그래밍 언어에서는 업캐스팅, 다운캐스팅, 크로스캐스팅과 같은 다양한 종류의 형 변환이 가능하다.

3. 1. 업캐스팅 (Upcasting)

어떤 클래스 `Base`와 `Base`에서 파생된 클래스 `Derived`가 있다고 가정한다. 업캐스팅이란 파생 클래스에서 기본 클래스로의 형 변환, 즉 `Derived`의 인스턴스를 `Base`로 변환하는 연산이다. "`Derived`의 인스턴스는 `Base`의 인스턴스이다"라는 것이 보장되므로, 이 변환은 안전하다. 따라서 많은 언어에서 업캐스팅은 암묵적으로 수행할 수 있다 (리스코프 치환 원칙). 예외적으로, F#은 암묵적 변환을 허용하지 않는 언어이며, 인터페이스 (추상 기본 클래스)의 메서드는 해당 인터페이스를 구현한 클래스 (파생 클래스)의 인스턴스에서 직접 호출할 수 없으며, 먼저 인터페이스 형으로의 명시적인 업캐스팅이 필요하다[17].

3. 2. 다운캐스팅 (Downcasting)

다운캐스팅은 기본 클래스 타입의 객체를 파생 클래스 타입으로 변환하는 것이다. 이 변환은 "Base의 인스턴스가 반드시 Derived의 인스턴스라고는 할 수 없으므로" 일반적으로 안전하지 않으며 오류가 발생할 수 있다.[18] 따라서 많은 언어에서는 명시적인 형 변환 구문을 사용해야 한다.

  • C++


C++에서는 안전한 다운캐스팅을 위해 `dynamic_cast` 구문을 사용한다. 이 구문은 런타임 형식 정보를 참조하여 포인터 간 변환 실패 시 `nullptr`를 반환하고, 참조 간 변환 실패 시 `std::bad_cast` 예외를 발생시킨다.[18] `dynamic_cast`를 사용하려면 기본 클래스에 가상 함수가 하나 이상 있어야 한다.[18] 확실히 성공할 다운캐스팅은 `static_cast`로 대체하여 런타임 비용을 줄일 수 있지만, 실패 가능성이 있다면 사용할 수 없다.[18]

```cpp

Animal* animal = new Cat;

Bulldog* b = dynamic_cast(animal); // if (animal is Bulldog), b = (Bulldog*) animal, else b = nullptr

```

  • Java


Java(Java)에서는 다운캐스팅 실패 시 `ClassCastException` 예외가 발생한다. C++의 `dynamic_cast`와 같은 기능은 없지만, `instanceof` 연산자로 형식 정보를 확인할 수 있다.[19]

  • C#


C# (C#)에서는 다운캐스팅 실패 시 `System.InvalidCastException` 예외가 발생한다. `as` 연산자를 사용하면 변환 실패 시 null을 반환하는 참조형 또는 Nullable 형식으로 변환할 수 있다.[20] `is` 연산자는 형식 호환성을 bool형 값으로 반환한다.[21]

```csharp

Animal animal = new Cat();

Bulldog b = animal as Bulldog; // if (animal is Bulldog), b = (Bulldog) animal, else b = null

```

일반적으로 객체 지향 프로그래밍에서는 다형성을 사용해야 하며, 다운캐스팅이 빈번하게 사용된다면 프로그램 설계에 문제가 있을 가능성이 높다.

3. 3. 크로스캐스팅 (Crosscasting)

어떤 클래스 `Derived`가 두 개의 기초 클래스 `Base1`과 `Base2`를 다중 상속한다고 가정할 때, `Base1`에서 `Base2`와 같이 기초 클래스끼리 형 변환을 하는 것을 크로스 캐스트라고 한다. 변환 대상이 `Derived`의 인스턴스이면 캐스트는 성공하지만, 이는 실행 시에 알 수 있으므로 다운 캐스트와 마찬가지로 안전한 형 변환은 아니다.

C++에서는 다운 캐스트와 동일한 구문 `dynamic_cast`로 안전한 크로스 캐스트를 수행할 수 있다.[23][24][25]

4. 다양한 프로그래밍 언어에서의 형 변환

에이다는 제네릭 라이브러리 함수인 Unchecked_Conversion을 제공한다.[8]

Eiffel에서 형 변환은 타입 시스템 규칙에 통합되어 있다. 할당 규칙에 따르면 `x := y`와 같은 할당은 소스 표현식(이 경우 `y`)의 타입이 대상 엔티티(이 경우 `x`)의 타입과 '호환'될 때만 유효하다. '호환'은 소스 표현식의 타입이 대상의 타입에 '순응'하거나 '변환'될 수 있음을 의미한다. 타입 순응은 객체 지향 프로그래밍의 다형성의 일반적인 규칙에 따라 정의된다. 예를 들어, `y`의 타입은 `y`가 기반하는 클래스가 `x`가 기반하는 클래스의 후손일 경우 `x`의 타입에 순응한다.

러스트는 기본 자료형 간의 암시적 형 변환(강제 변환)을 제공하지 않지만, `as` 키워드를 사용하여 명시적 형 변환(캐스팅)을 수행할 수 있다.[10]

```rust

let x = 1000;

println!("1000 as a u16 is: {}", x as u16);

```

TypeScript에서 형 변환은 `as` 키워드를 사용하여 수행된다.[11]

```typescript

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

```

위 예에서 `document.getElementById`는 `HTMLElement`를 반환하도록 선언되었지만, 이 경우 항상 `HTMLElement`의 하위 유형인 `HTMLCanvasElement`를 반환한다는 것을 알 수 있다. 그렇지 않은 경우 TypeScript는 런타임에 형 변환을 확인하지 않으므로 `HTMLCanvasElement`의 동작에 의존하는 후속 코드가 제대로 실행되지 않는다.

TypeScript에는 런타임 형식 지원이 없으므로 런타임에 값이 특정 유형인지 확인하는 일반적인 방법은 없다. 그러나 사용자가 컴파일러에게 값이 특정 유형인지 여부를 알려주는 사용자 정의 함수를 작성할 수 있다. 이러한 함수를 '''타입 가드(type guard)'''라고 하며, `x is Type`의 반환 유형으로 선언된다. 여기서 `x`는 `boolean` 대신 매개변수 또는 `this`이다. 이를 통해 안전하지 않은 형 변환을 코드베이스에 흩어지지 않고 검사 함수에 포함할 수 있다.

Go에서 타입 어서션(type assertion)은 인터페이스 값에서 구체적인 타입 값을 가져오는 데 사용된다. 타입 어서션은 안전하며, 값이 지정된 구체적인 타입이 아니면 패닉(panic)을 발생시키거나(반환 값이 하나인 경우), 제로 값을 반환한다(반환 값이 두 개인 경우).[12]

```go

t := i.(T)

```

이 타입 어서션은 시스템에 `i`가 `T` 타입임을 알려준다. 그렇지 않으면 패닉이 발생한다.[12]

4. 1. C/C++

C/C++는 암시적 형 변환과 명시적 형 변환을 모두 지원한다.

  • 암시적 형 변환: 컴파일러가 자동으로 수행하는 형 변환으로, '형 강제 변환(type coercion)'이라고도 한다.[15] 예를 들어, 서로 다른 자료형의 변수들이 연산될 때, 모든 변수는 가장 상위의 자료형으로 자동 변환된다.
  • C 언어 예시:

```c

double d;

long l;

int i;

/* ... */

if (d > i) d = i;

if (i > l) l = i;

if (d == l) d *= 2;

```

  • 위 코드에서 `d`, `l`, `i`는 서로 다른 자료형을 가지지만, 비교나 대입 연산 시 자동으로 같은 자료형으로 변환된다.
  • 주의사항: `double`형(부동소수점 수)을 `int`형(정수형)으로 변환하는 경우처럼, 정보 손실이 발생할 수 있다.
  • `float`에서 `int`로 변환하면 절삭이 발생하여 소수점 이하 부분을 제거한다.
  • `double`에서 `float`로 변환하면 숫자를 반올림한다.
  • `long`에서 `int`로 변환하면 초과하는 상위 비트를 삭제한다.
  • C 언어 및 C++에서는 암묵적 축소 변환을 허용하지만, 정보가 손실될 가능성이 있는 변환에 대해 통상 컴파일러가 경고를 낸다.
  • 명시적 형 변환: 타입 캐스팅이라고도 하며, 프로그래머가 명시적으로 지정하는 형 변환이다.
  • C 스타일 캐스트 연산자: `(Type)expression`
  • C++ 스타일 캐스트 연산자:
  • `static_cast`: 일반적인 형 변환에 사용된다.
  • `dynamic_cast`: 객체 지향 프로그래밍에서 다운캐스팅에 사용되며, 런타임에 타입 검사를 수행한다.
  • `reinterpret_cast`: 비트 패턴을 그대로 복사하여 다른 타입으로 해석하는 데 사용된다.
  • `const_cast`: `const` 속성을 제거하는 데 사용된다.
  • C++에서는 의미가 모호한 C 스타일 캐스트는 권장되지 않으며, 상황에 맞는 C++ 스타일 캐스트를 사용하는 것이 좋다.
  • C++ 예시:

```cpp

double da = 3.3;

double db = 3.3;

double dc = 3.4;

int result = (int)da + (int)db + (int)dc; // result == 9

// 암시적 변환이 사용될 경우 ("result = da + db + dc"와 같이), result는 10이 된다.

```

  • 사용자 정의 형 변환 (C++):
  • C++에서는 사용자가 정의한 클래스에 대해 형 변환을 정의할 수 있다.
  • 변환 생성자(converting constructor): 다른 형을 인수로 받는 생성자를 정의하여 암시적 형 변환을 제공한다.
  • `explicit` 키워드: 생성자에 `explicit`를 붙이면 암시적 형 변환을 막고, 명시적 형 변환만 허용한다.


```cpp

class Class1 { };

class Class2 {

public:

explicit Class2(Class1 c1) { /* ... */ }

};

void test() {

Class1 c1;

Class2 c2 = (Class2)c1;

// explicit 수식자가 없으면 Class2 c2 = c1; 으로 된다.

// explicit 의 유무에 관계없이, Class2 c2(c1); 로 쓰는 것은 항상 가능하다.

}

4. 2. Java

Java나 C#에서 `int`에서 `long`으로의 형 변환은 크기를 두 배로 늘리는 확장 변환이며, 반대로 `long`에서 `int`로의 형 변환은 크기를 절반으로 줄이는 축소 변환이다.[1]

4. 3. C#

C#은 C/C++과 유사하게 암시적 형 변환과 명시적 형 변환을 모두 지원한다. `as` 연산자를 사용하면 안전하게 형 변환을 시도할 수 있는데, 형 변환에 실패하면 `null`을 반환한다.[9] `is` 연산자를 사용하여 타입 호환성을 미리 검사할 수도 있다.

```csharp

Animal animal = new Cat();

Bulldog b = (Bulldog) animal; // animal이 Bulldog 타입이면 변환, 아니면 예외 발생

b = animal as Bulldog; // animal이 Bulldog 타입이면 변환, 아니면 b는 null

animal = null;

b = animal as Bulldog; // b는 null

```

C#에서는 정수 간, 또는 정수와 부동 소수점 수 사이의 형 변환과 같이 매우 일반적인 형 변환도 지원한다. 예를 들어, C#의 `int`에서 `long`으로의 형 변환은 크기를 두 배로 늘리는 확대 변환이고, `long`에서 `int`로의 형 변환은 크기를 절반으로 줄이는 축소 변환이다.

4. 4. Eiffel

Eiffel에서 형 변환 개념은 타입 시스템의 규칙에 통합되어 있다.[8] 할당 규칙에 따르면, 다음과 같은 할당은 소스 표현식(이 경우 `y`)의 타입이 대상 엔티티(이 경우 `x`)의 타입과 '호환'될 때만 유효하다.

```eiffel

x := y

```

여기서 '호환'은 소스 표현식의 타입이 대상의 타입에 '순응'하거나 '변환'될 수 있음을 의미한다. 타입의 순응은 객체 지향 프로그래밍의 다형성에 대한 일반적인 규칙에 의해 정의된다. 예를 들어, 위의 할당에서 `y`의 타입은 `y`가 기반하는 클래스가 `x`가 기반하는 클래스의 후손일 경우 `x`의 타입에 순응한다.

Eiffel에서 형 변환의 동작, 특히 "변환 대상" 및 "변환 출처"는 다음과 같이 정의된다.

> 클래스 CU를 기반으로 하는 형이 클래스 CT를 기반으로 하는 형 T로 ''변환 대상''이 되려면 (그리고 T는 U에서 ''변환 출처''가 됨) 다음 중 하나를 만족해야 한다.

> : CT가 U를 변환 형으로 사용하는 ''변환 프로시저''를 가지거나,

> : CU가 T를 변환 형으로 나열하는 ''변환 쿼리''를 가질 경우

Eiffel은 마이크로소프트 CLI 언어를 완전히 준수하는 .NET Framework용 언어이다. .NET 개발 이전에 Eiffel은 이미 광범위한 클래스 라이브러리를 가지고 있었다. .NET 형식 라이브러리, 특히 문자열과 같이 일반적으로 사용되는 형식을 사용하면 변환 문제가 발생한다. 기존 Eiffel 소프트웨어는 Eiffel 라이브러리의 문자열 클래스(`STRING_8` 등)를 사용하지만, .NET용으로 작성된 Eiffel 소프트웨어는 .NET 형식을 인수로 전달해야 하는 .NET 메서드를 호출하는 경우와 같이 많은 경우에 .NET 문자열 클래스(`System.String`)를 사용해야 한다. 따라서 이러한 형식의 변환은 가능한 한 원활하게 이루어져야 한다.

```eiffel

my_string: STRING_8 -- 네이티브 Eiffel 문자열

my_system_string: SYSTEM_STRING -- 네이티브 .NET 문자열

...

my_string := my_system_string

```

위 코드에서 각각 다른 형식(`SYSTEM_STRING`은 System.String에 대한 Eiffel 준수 별칭)의 두 문자열이 선언된다. `System.String`이 `STRING_8`을 준수하지 않으므로 위 할당은 `System.String`이 `STRING_8`으로 변환되는 경우에만 유효하다.

Eiffel 클래스 `STRING_8`에는 `System.String` 형식의 객체를 위한 변환 프로시저 `make_from_cil`이 있다. 변환 프로시저는 생성 프로시저(생성자와 유사)로도 지정된다. 다음은 `STRING_8` 클래스의 발췌문이다.

```eiffel

class STRING_8

...

create

make_from_cil

...

convert

make_from_cil ({SYSTEM_STRING})

...

```

변환 프로시저가 있으면 할당:

```eiffel

my_string := my_system_string

```

는 의미상 다음과 같다.

```eiffel

create my_string.make_from_cil (my_system_string)

```

여기서 `my_string`은 `my_system_string`과 동일한 내용으로 `STRING_8` 형식의 새 객체로 구성된다.

원래 소스와 대상이 반대인 할당을 처리하려면:

```eiffel

my_system_string := my_string

```

클래스 `STRING_8`에는 `STRING_8`의 인스턴스에서 `System.String`을 생성하는 변환 쿼리 `to_cil`도 포함되어 있다.

```eiffel

class STRING_8

...

create

make_from_cil

...

convert

make_from_cil ({SYSTEM_STRING})

to_cil: {SYSTEM_STRING}

...

```

그 다음 할당:

```eiffel

my_system_string := my_string

```

는 다음과 같다.

```eiffel

my_system_string := my_string.to_cil

```

Eiffel에서 형식 변환 설정은 클래스 코드에 포함되지만 클라이언트 코드에서 명시적 형식 변환과 마찬가지로 자동으로 발생하는 것으로 보인다. 여기에는 할당뿐만 아니라 인수(매개변수) 대체와 같은 다른 유형의 첨부도 포함된다.

4. 5. Rust

러스트는 기본 자료형 간의 암시적 형 변환(강제 변환)을 제공하지 않는다. 하지만, `as` 키워드를 사용하여 명시적 형 변환(캐스팅)을 수행할 수 있다.[10]

```rust

let x = 1000;

println!("1000 as a u16 is: {}", x as u16);

```
수정 사항:

  • `` 태그를 제거하고, `` 태그를 ```` ``` ```` 형태로 변경했습니다.
  • 코드 블록의 언어를 명시했습니다. (```rust)
  • 나머지 사항은 이전 출력과 동일하며, 모든 지시사항을 준수합니다.

4. 6. TypeScript

TypeScript에서 형 변환은 `as` 키워드를 사용하여 수행된다.[11]

```typescript

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

```

위의 예에서 `document.getElementById`는 `HTMLElement`를 반환하도록 선언되었지만, 이 경우 항상 `HTMLElement`의 하위 유형인 `HTMLCanvasElement`를 반환한다는 것을 알 수 있다. 그렇지 않은 경우, TypeScript는 런타임에 형 변환을 확인하지 않으므로 `HTMLCanvasElement`의 동작에 의존하는 후속 코드가 제대로 실행되지 않는다.

TypeScript에는 런타임 형식 지원이 없으므로 런타임에 값이 특정 유형인지 확인하는 일반적인 방법이 없다. 그러나 사용자가 컴파일러에게 값이 특정 유형인지 여부를 알려주는 사용자 정의 함수를 작성하는 것은 가능하다. 이러한 함수를 '''타입 가드(type guard)'''라고 하며, `x is Type`의 반환 유형으로 선언된다. 여기서 `x`는 `boolean` 대신 매개변수 또는 `this`이다.

이를 통해 안전하지 않은 형 변환을 코드베이스에 흩어지지 않고 검사 함수에 포함할 수 있다.

4. 7. Go

Go에서 타입 어서션(type assertion)은 인터페이스 값에서 구체적인 타입 값을 가져오는 데 사용된다. 타입 어서션은 안전하며, 값이 지정된 구체적인 타입이 아니면 패닉(panic)을 발생시키거나(반환 값이 하나인 경우), 제로 값을 반환한다(반환 값이 두 개인 경우).[12]

```go

t := i.(T)

```

이 타입 어서션은 시스템에 `i`가 `T` 타입임을 알려준다. 그렇지 않으면 패닉이 발생한다.[12]

5. 형 변환의 보안 문제

형 변환은 해킹에 악용될 수 있는 잠재적인 보안 취약점을 가지고 있다. 해커는 형 변환을 통해 변수의 데이터 형식을 임시로 변경하여, 컴파일러가 해당 변수를 다른 데이터 형식으로 처리하도록 유도할 수 있다.[13][14]

참조

[1] 서적 S. Chand's Computer Science S. Chand
[2] 서적 Programming Languages - Design and Constructs Laxmi Publications
[3] 서적 Concise Encyclopedia of Computer Science https://archive.org/[...] John Wiley & Sons
[4] 서적 Pro TypeScript: Application-Scale JavaScript Development Apress
[5] 웹사이트 PHP: Type Juggling - Manual http://php.net/manua[...] 2019-01-27
[6] 서적 C++ Quick Syntax Reference Apress
[7] 서적 Computational Intelligence: A Methodological Introduction Springer 2016-09-16
[8] 웹사이트 Unchecked Type Conversions https://www.adaic.or[...] 2023-03-11
[9] 웹사이트 Advanced C#: Checked Type Casts http://ssw.jku.at/Te[...] Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik 2002-03-25
[10] 웹사이트 Casting - Rust By Example https://doc.rust-lan[...]
[11] 웹사이트 Typescript documentation https://www.typescri[...]
[12] 웹사이트 A Tour of Go https://go.dev/tour/[...]
[13] 서적 Hacking, 2nd Edition: The Art of Exploitation
[14] 서적 Magnifying C
[15] 웹사이트 Type coercion (型強制) https://developer.mo[...]
[16] 웹사이트 explicit 指定子 https://ja.cpprefere[...]
[17] 웹사이트 F# のインターフェイス https://learn.micros[...]
[18] 웹사이트 dynamic_cast 変換 https://ja.cpprefere[...]
[19] 웹사이트 Java 14におけるinstanceofのパターン・マッチング https://blogs.oracle[...]
[20] 웹사이트 https://docs.microso[...]
[21] 웹사이트 型のテスト演算子とキャスト式 https://learn.micros[...]
[22] 웹사이트 https://docs.microso[...]
[23] 웹사이트 Casting Operators https://docs.microso[...]
[24] 웹사이트 safe_cast (C++/CLI and C++/CX) https://docs.microso[...]
[25] 웹사이트 Casting (C++/CX) https://learn.micros[...]
[26] 서적 S. Chand's Computer Science
[27] 서적 Programming Languages - Design and Constructs
[28] 서적 Concise Encyclopedia of Computer Science https://archive.org/[...]
[29] 서적 Pro TypeScript: Application-Scale JavaScript Development
[30] 웹인용 PHP: Type Juggling - Manual http://php.net/manua[...] 2019-01-27



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com